/**
 * 将数字转换为指定长度的16进制字符串（增强版，兼容非整数输入）
 * @param num 要转换的数字（可以是正数、负数或浮点数）
 * @param length 目标16进制字符串的长度
 * @returns 格式化后的16进制字符串
 */
export function intToHex(num: number, length: number): string {
    // 尝试将输入转换为整数
    const intNum = Math.round(num);

    // 处理非数字输入
    if (isNaN(intNum)) {
        throw new Error('输入必须是有效的数字');
    }

    if (length === 0) {
        length = 2;
    }
    // 处理长度为0或负数的情况
    if (length <= 0) {
        throw new Error('长度必须是正整数');
    }

    // 计算最大可表示的值（根据长度计算）
    const maxBits = length * 4;
    const maxValue = (1 << (maxBits - 1)) - 1;
    const minValue = -(1 << (maxBits - 1));

    // 检查数值是否在当前长度可表示的范围内
    if (intNum > maxValue || intNum < minValue) {
        console.warn(`数值${intNum}超出${maxBits}位带符号整数范围，可能导致转换结果不准确`);
    }

    // 处理负数，计算补码
    let hexNum = intNum;
    if (intNum < 0) {
        hexNum = (1 << maxBits) + intNum;
    }

    // 转换为16进制，并处理大小写和填充
    let hexStr = hexNum.toString(16).toUpperCase();

    // 处理长度：如果超过指定长度则截断，不足则补0
    if (hexStr.length > length) {
        hexStr = hexStr.slice(-length); // 截断到指定长度（保留低位）
    } else if (hexStr.length < length) {
        hexStr = hexStr.padStart(length, '0'); // 不足则在前面补0
    }

    return hexStr;
}
